Model ten dzieli rozpatrywaną populację na trzy stany:
Liczba osób w danym stanie opisywana jest w funkcji czasu, odpowiednio I, S albo R. Jednocześnie w danym czasie t suma wartości tych trzech funkcji w tym punkcie czasu wynosi N (liczebność rozpatrywanej populacji). Model SIR bazuje na następujących równaniach różniczkowych, opisujących tempo przyrostu liczebności poszczególnych grup:

gdzie:
Stanowi ważny parametr opisu dynamiki epidemii. Określa on średnią liczbę osób zakażonych przez jedną zainfekowaną osobę. $$R_{0}=\frac{\beta}{\gamma}$$
Osoby, które przebyły chorobę COVID-19, wykształcają odporność trwającą przez co najmniej 5-7 miesięcy. Stanowi to na tyle długi okres czasu, że tzw. "ozdrowieńców" zakwalifikować można do grupy R, co umożliwia zastosowanie modelu SIR w badaniu przebiegu epidemii SARS-COV-2.
using DifferentialEquations
# using Plotly
using Plots
# plotly()
# Plots.PlotlyBackend()
# using PlotlyBase
# using PyPlot
function parameterized_derivative!(du, u, p, t)
S, I, R = u
beta, gamma, N = p
du[1] = -beta * S * I / N
du[2] = beta * S * I / N - gamma * I
du[3] = gamma * I
end
parameterized_derivative! (generic function with 1 method)
function SIR_computations(parameters, variables, days)
beta = parameters[1]
gamma = parameters[2]
N = parameters[3]
I0 = variables[1]
R0 = variables[2]
S0 = variables[3]
# Define differential equation problem
u0 = [S0; I0; R0]
tspan = (0.0, days)
params = [ beta, gamma, N]
prob = ODEProblem(parameterized_derivative!, u0, tspan, params);
alg = RK4()
# Solve system of differential equations
sol = solve(prob, alg);
return sol
end
SIR_computations (generic function with 1 method)
# Define model parameters
N = 1000.0
beta = 0.15
gamma = 1.0/21.0
# Define population
I0 = 1;
R0 = 0;
S0 = N - I0 - R0;
parameters = (beta, gamma, N)
variables = (I0, R0, S0)
days = 200.0
# Perform computations
result = SIR_computations(parameters, variables, days)
# Plot results
plot1 = Plots.plot(result, vars=[(0,1), (0,2), (0,3)], title="SIR Model:\n beta = 0.15, gamma = 1/21",
xaxis="Time [days]", yaxis="Population", marker=0.01, label=["Susceptible (S)" "Infected (I)" "Removed (R)"],
xticks = 0:25:200, yticks = 0:100:1000)
# Define model parameters
N = 1000.0
beta = 0.15
gamma = 1.0/14.0
# Define population
I0 = 1;
R0 = 0;
S0 = N - I0 - R0;
parameters = (beta, gamma, N)
variables = (I0, R0, S0)
days = 200.0
# Perform computations
result = SIR_computations(parameters, variables, days);
# Plot results
plot2 = Plots.plot(result, vars=[(0,1), (0,2), (0,3)], title="SIR Model:\n beta = 0.15, gamma = 1/14",
xaxis="Time [days]", yaxis="Population", marker=0.01, label=["Susceptible (S)" "Infected (I)" "Removed (R)"],
xticks = 0:25:200, yticks = 0:100:1000)
Plots.plot(plot1, plot2, layout=(1,2), size=(1100,500))
Zestawienie powyższych wykresów ilustruje zależność dynamiki przebiegu epidemii od czasu zdrowienia. Przyglądając się punktowi tzw. odporności zbiorowej, przyjmowanej jako R=70%, widać, że jest jest ona osiągana szybiej, gdy czas zdrowienia jest dłuższy (21 dni w porównaniu do 14 dni). Dzieje się tak ponieważ osobniki zakażone mają szansę zarażać dłużej, zanim wyzdrowieją, zatem fala zakażeń ma bardziej dynamiczny przebieg, większa liczba osób szybciej przechoruje, w konsekwencji czego odporność zbiorowa zostanie uzyskana szybciej.
# using IJulia
# using Conda
# using Interact
# using WebIO
# WebIO.install_jupyter_labextension()
# notebook(dir = Interact.notebookdir)
# WebIO.install_jupyter_labextension(condajl=true)
# using WebIO
# WebIO.install_jupyter_nbextension()
#using Blink
Error handling websocket connection: TaskFailedException Stacktrace: [1] wait @ .\task.jl:317 [inlined] [2] create_socket(req::Dict{Any, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:47 [3] (::Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)})(f::Function, x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:17 [4] (::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}})(x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [5] splitquery(app::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\basics.jl:31 [6] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [7] wcatch(app::Mux.var"#1#2"{typeof(Mux.splitquery), Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\websockets_integration.jl:12 [8] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [9] todict @ ~\.julia\packages\Mux\3h8RY\src\basics.jl:25 [inlined] [10] #3 (repeats 2 times) @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:14 [inlined] [11] (::Mux.var"#1#2"{Mux.var"#3#4"{Mux.var"#3#4"{typeof(Mux.todict), typeof(Mux.wcatch)}, typeof(Mux.splitquery)}, Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}})(x::Tuple{HTTP.Messages.Request, WebSockets.WebSocket{Sockets.TCPSocket}}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [12] (::Mux.var"#9#10"{Mux.App})(req::HTTP.Messages.Request, client::WebSockets.WebSocket{Sockets.TCPSocket}) @ Mux ~\.julia\packages\Mux\3h8RY\src\server.jl:49 [13] upgrade(f::Mux.var"#9#10"{Mux.App}, stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:201 [14] (::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:370 [15] macro expansion @ ~\.julia\packages\HTTP\IAI92\src\Servers.jl:367 [inlined] [16] (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() @ HTTP.Servers .\task.jl:406 nested task error: WebSockets.WebSocketClosedError("ws|server respond to OPCODE_CLOSE 1001: Going Away") Stacktrace: [1] handle_control_frame(ws::WebSockets.WebSocket{Sockets.TCPSocket}, wsf::WebSockets.WebSocketFragment) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:376 [2] read(ws::WebSockets.WebSocket{Sockets.TCPSocket}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:459 [3] macro expansion @ ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:41 [inlined] [4] (::WebIO.var"#110#111"{WebIO.WebSockConnection, WebSockets.WebSocket{Sockets.TCPSocket}})() @ WebIO .\task.jl:406┌ Error: (Base.IOError("read: connection reset by peer (ECONNRESET)", -4077), Base.StackTraces.StackFrame[wait_readnb(x::Sockets.TCPSocket, nb::Int64) at stream.jl:408, eof at stream.jl:106 [inlined], read_to_buffer(t::HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, sizehint::Int64) at ConnectionPool.jl:251, readuntil(t::HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, f::Function, sizehint::Int64) at ConnectionPool.jl:271, readuntil at ConnectionPool.jl:269 [inlined], readheaders at Messages.jl:471 [inlined], startread(http::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) at Streams.jl:155, handle_transaction(f::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, t::HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, server::HTTP.Servers.Server{Nothing, Sockets.TCPServer}; final_transaction::Bool) at Servers.jl:343, (::HTTP.Servers.var"#handle_transaction##kw")(::NamedTuple{(:final_transaction,), Tuple{Bool}}, ::typeof(HTTP.Servers.handle_transaction), f::Function, t::HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, server::HTTP.Servers.Server{Nothing, Sockets.TCPServer}) at Servers.jl:338, handle_connection(f::Function, c::HTTP.ConnectionPool.Connection{Sockets.TCPSocket}, server::HTTP.Servers.Server{Nothing, Sockets.TCPServer}, reuse_limit::Int64, readtimeout::Int64) at Servers.jl:299, (::HTTP.Servers.var"#8#9"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.Servers.Server{Nothing, Sockets.TCPServer}, Base.RefValue{Int64}, Int64, Int64, Bool, HTTP.ConnectionPool.Connection{Sockets.TCPSocket}})() at task.jl:406]) └ @ HTTP.Servers C:\Users\basia\.julia\packages\HTTP\IAI92\src\Servers.jl:264 Error handling websocket connection: TaskFailedException Stacktrace: [1] wait @ .\task.jl:317 [inlined] [2] create_socket(req::Dict{Any, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:47 [3] (::Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)})(f::Function, x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:17 [4] (::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}})(x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [5] splitquery(app::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\basics.jl:31 [6] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [7] wcatch(app::Mux.var"#1#2"{typeof(Mux.splitquery), Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\websockets_integration.jl:12 [8] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [9] todict @ ~\.julia\packages\Mux\3h8RY\src\basics.jl:25 [inlined] [10] #3 (repeats 2 times) @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:14 [inlined] [11] (::Mux.var"#1#2"{Mux.var"#3#4"{Mux.var"#3#4"{typeof(Mux.todict), typeof(Mux.wcatch)}, typeof(Mux.splitquery)}, Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}})(x::Tuple{HTTP.Messages.Request, WebSockets.WebSocket{Sockets.TCPSocket}}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [12] (::Mux.var"#9#10"{Mux.App})(req::HTTP.Messages.Request, client::WebSockets.WebSocket{Sockets.TCPSocket}) @ Mux ~\.julia\packages\Mux\3h8RY\src\server.jl:49 [13] upgrade(f::Mux.var"#9#10"{Mux.App}, stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:201 [14] (::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:370 [15] macro expansion @ ~\.julia\packages\HTTP\IAI92\src\Servers.jl:367 [inlined] [16] (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() @ HTTP.Servers .\task.jl:406 nested task error: WebSockets.WebSocketClosedError("ws|server respond to OPCODE_CLOSE 1001: Going Away") Stacktrace: [1] handle_control_frame(ws::WebSockets.WebSocket{Sockets.TCPSocket}, wsf::WebSockets.WebSocketFragment) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:376 [2] read(ws::WebSockets.WebSocket{Sockets.TCPSocket}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:459 [3] macro expansion @ ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:41 [inlined] [4] (::WebIO.var"#110#111"{WebIO.WebSockConnection, WebSockets.WebSocket{Sockets.TCPSocket}})() @ WebIO .\task.jl:406Error handling websocket connection: TaskFailedException Stacktrace: [1] wait @ .\task.jl:317 [inlined] [2] create_socket(req::Dict{Any, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:47 [3] (::Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)})(f::Function, x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:17 [4] (::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}})(x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [5] splitquery(app::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\basics.jl:31 [6] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [7] wcatch(app::Mux.var"#1#2"{typeof(Mux.splitquery), Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\websockets_integration.jl:12 [8] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [9] todict @ ~\.julia\packages\Mux\3h8RY\src\basics.jl:25 [inlined] [10] #3 (repeats 2 times) @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:14 [inlined] [11] (::Mux.var"#1#2"{Mux.var"#3#4"{Mux.var"#3#4"{typeof(Mux.todict), typeof(Mux.wcatch)}, typeof(Mux.splitquery)}, Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}})(x::Tuple{HTTP.Messages.Request, WebSockets.WebSocket{Sockets.TCPSocket}}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [12] (::Mux.var"#9#10"{Mux.App})(req::HTTP.Messages.Request, client::WebSockets.WebSocket{Sockets.TCPSocket}) @ Mux ~\.julia\packages\Mux\3h8RY\src\server.jl:49 [13] upgrade(f::Mux.var"#9#10"{Mux.App}, stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:201 [14] (::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:370 [15] macro expansion @ ~\.julia\packages\HTTP\IAI92\src\Servers.jl:367 [inlined] [16] (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() @ HTTP.Servers .\task.jl:406 nested task error: WebSockets.WebSocketClosedError("ws|server respond to OPCODE_CLOSE 1001: Going Away") Stacktrace: [1] handle_control_frame(ws::WebSockets.WebSocket{Sockets.TCPSocket}, wsf::WebSockets.WebSocketFragment) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:376 [2] read(ws::WebSockets.WebSocket{Sockets.TCPSocket}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:459 [3] macro expansion @ ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:41 [inlined] [4] (::WebIO.var"#110#111"{WebIO.WebSockConnection, WebSockets.WebSocket{Sockets.TCPSocket}})() @ WebIO .\task.jl:406
using Mux
#WebIO.webio_serve(page("/", req -> ui), rand(8000:9000))
WebIO.webio_serve(page("/", req -> tot), 8007)
Task (runnable) @0x0000000088d5ad60
Error handling websocket connection: TaskFailedException Stacktrace: [1] wait @ .\task.jl:317 [inlined] [2] create_socket(req::Dict{Any, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:47 [3] (::Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)})(f::Function, x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:17 [4] (::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}})(x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [5] splitquery(app::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\basics.jl:31 [6] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [7] wcatch(app::Mux.var"#1#2"{typeof(Mux.splitquery), Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\websockets_integration.jl:12 [8] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [9] todict @ ~\.julia\packages\Mux\3h8RY\src\basics.jl:25 [inlined] [10] #3 (repeats 2 times) @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:14 [inlined] [11] (::Mux.var"#1#2"{Mux.var"#3#4"{Mux.var"#3#4"{typeof(Mux.todict), typeof(Mux.wcatch)}, typeof(Mux.splitquery)}, Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}})(x::Tuple{HTTP.Messages.Request, WebSockets.WebSocket{Sockets.TCPSocket}}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [12] (::Mux.var"#9#10"{Mux.App})(req::HTTP.Messages.Request, client::WebSockets.WebSocket{Sockets.TCPSocket}) @ Mux ~\.julia\packages\Mux\3h8RY\src\server.jl:49 [13] upgrade(f::Mux.var"#9#10"{Mux.App}, stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:201 [14] (::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:370 [15] macro expansion @ ~\.julia\packages\HTTP\IAI92\src\Servers.jl:367 [inlined] [16] (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() @ HTTP.Servers .\task.jl:406 nested task error: TypeError: non-boolean (Int64) used in boolean context Stacktrace: [1] switch_timer(switch::Int64) @ Main .\In[118]:33 [2] #invokelatest#2 @ .\essentials.jl:708 [inlined] [3] invokelatest @ .\essentials.jl:706 [inlined] [4] setindex!(observable::Observable{Any}, val::Int64; notify::Base.var"#76#77"{Base.Fix2{typeof(in), Vector{Function}}}) @ Observables ~\.julia\packages\Observables\Yf3xU\src\Observables.jl:207 [5] (::Observables.var"#42#45"{InteractBase.var"#126#129"{Observable{Any}}, Observable{Any}, Vector{Function}})(val::Int64) @ Observables ~\.julia\packages\Observables\Yf3xU\src\observablepair.jl:19 [6] #invokelatest#2 @ .\essentials.jl:708 [inlined] [7] invokelatest @ .\essentials.jl:706 [inlined] [8] setindex!(observable::Observable{Any}, val::Int64; notify::WebIO.var"#44#45") @ Observables ~\.julia\packages\Observables\Yf3xU\src\Observables.jl:207 [9] setexcludinghandlers @ ~\.julia\packages\Observables\Yf3xU\src\Observables.jl:260 [inlined] [10] set_nosync(ob::Observable{Any}, val::Int64) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\scope.jl:339 [11] dispatch(ctx::Scope, key::String, data::Int64) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\scope.jl:348 [12] dispatch_command(conn::WebIO.WebSockConnection, data::Dict{String, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\messaging.jl:104 [13] dispatch(conn::WebIO.WebSockConnection, data::Dict{String, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\messaging.jl:81 [14] macro expansion @ ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:44 [inlined] [15] (::WebIO.var"#110#111"{WebIO.WebSockConnection, WebSockets.WebSocket{Sockets.TCPSocket}})() @ WebIO .\task.jl:406
# Define population
I0 = 1;
R0 = 0;
days = 200.0
import Colors
using Plots
function mycolorpicker()
N = slider(1:1000, label = "N")
beta = slider(0:0.01:1, label = "beta")
gamma = slider(0:0.01:1, label = "gamma")
parameters = Interact.@map (&beta, &gamma, &N)
S0 = Interact.@map &N - I0 - R0;
variables = Interact.@map (I0, R0, &S0)
output = Interact.@map SIR_computations(¶meters, &variables, days);
plt = Interact.@map plot(&output, vars=[(0,1), (0,2), (0,3)], title="SIR Model:\n beta = 0.15, gamma = 1/14",
xaxis="Time [days]", yaxis="Population", marker=0.01, label=["Susceptible (S)" "Infected (I)" "Removed (R)"],
xticks = 0:25:200, yticks = 0:100:1000)
wdg = Widget(["N" => N, "beta" => beta, "gamma" => gamma], output = output)
@layout! wdg hbox(plt, vbox(:N, :beta, :gamma), plt) ## custom layout: by default things are stacked vertically
end
mycolorpicker (generic function with 1 method)
ui = mycolorpicker()
o=Observable(ui)
ui
#using Blink
#w = Window()
#body!(w, ui)
Error handling websocket connection: TaskFailedException Stacktrace: [1] wait @ .\task.jl:317 [inlined] [2] create_socket(req::Dict{Any, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:47┌ Error: error handling request │ exception = (Base.IOError("stream is closed or unusable", 0), Base.StackTraces.StackFrame[check_open at stream.jl:386 [inlined], uv_write_async(s::Sockets.TCPSocket, p::Ptr{UInt8}, n::UInt64) at stream.jl:1018, uv_write(s::Sockets.TCPSocket, p::Ptr{UInt8}, n::UInt64) at stream.jl:981, unsafe_write(s::Sockets.TCPSocket, p::Ptr{UInt8}, n::UInt64) at stream.jl:1064, unsafe_write at ConnectionPool.jl:171 [inlined], write at io.jl:185 [inlined], closebody at Streams.jl:113 [inlined], closewrite(http::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) at Streams.jl:128, (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() at task.jl:406]) └ @ HTTP.Servers C:\Users\basia\.julia\packages\HTTP\IAI92\src\Servers.jl:373 [3] (::Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)})(f::Function, x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:17 [4] (::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}})(x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [5] splitquery(app::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\basics.jl:31 [6] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [7] wcatch(app::Mux.var"#1#2"{typeof(Mux.splitquery), Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\websockets_integration.jl:12 [8] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [9] todict @ ~\.julia\packages\Mux\3h8RY\src\basics.jl:25 [inlined] [10] #3 (repeats 2 times) @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:14 [inlined] [11] (::Mux.var"#1#2"{Mux.var"#3#4"{Mux.var"#3#4"{typeof(Mux.todict), typeof(Mux.wcatch)}, typeof(Mux.splitquery)}, Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}})(x::Tuple{HTTP.Messages.Request, WebSockets.WebSocket{Sockets.TCPSocket}}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [12] (::Mux.var"#9#10"{Mux.App})(req::HTTP.Messages.Request, client::WebSockets.WebSocket{Sockets.TCPSocket}) @ Mux ~\.julia\packages\Mux\3h8RY\src\server.jl:49 [13] upgrade(f::Mux.var"#9#10"{Mux.App}, stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:201 [14] (::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:370 [15] macro expansion @ ~\.julia\packages\HTTP\IAI92\src\Servers.jl:367 [inlined] [16] (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() @ HTTP.Servers .\task.jl:406 nested task error: WebSockets.WebSocketClosedError("ws|server respond to OPCODE_CLOSE 1001: Going Away") Stacktrace: [1] handle_control_frame(ws::WebSockets.WebSocket{Sockets.TCPSocket}, wsf::WebSockets.WebSocketFragment) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:376 [2] read(ws::WebSockets.WebSocket{Sockets.TCPSocket}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:459 [3] macro expansion @ ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:41 [inlined] [4] (::WebIO.var"#110#111"{WebIO.WebSockConnection, WebSockets.WebSocket{Sockets.TCPSocket}})() @ WebIO .\task.jl:406
using Interact
using Plots
using Blink
using InteractBulma
# Define the ODE functions
dS(S, I, R, N, beta, gamma) = -beta * S * I / N
dI(S, I, R, N, beta, gamma) = beta * S * I / N - gamma * I
dR(S, I, R, N, beta, gamma) = gamma * I
funcs = (dS, dI, dR)
# Visualisation
run_toggle_1 = toggle(label = "run") |> onchange
reset_toggle_1 = toggle(label = "reset") |> onchange
speed_toggle_1 = togglebuttons(OrderedDict(zip(["x1.0", "x2.0", "x5.0", "x10.0"], [1, 2, 5, 10])))
run_toggle_2 = toggle(label = "run") |> onchange
reset_toggle_2 = toggle(label = "reset") |> onchange
speed_toggle_2 = togglebuttons(OrderedDict(zip(["x1.0", "x2.0", "x5.0", "x10.0"], [1, 2, 5, 10])))
I0_box_1 = textbox("Initial condition: I0") |> onchange
R0_box_1 = textbox("Initial condition: R0") |> onchange
I0_box_2 = textbox("Initial condition: I0") |> onchange
R0_box_2 = textbox("Initial condition: R0") |> onchange
global timer_1 = Observable(0)
global speed_1 = 1
global timer_2 = Observable(0)
global speed_2 = 1
global initial_I0_1 = 1
global initial_R0_1 = 0
global initial_I0_2 = 1
global initial_R0_2 = 0
function switch_timer_1(switch)
if switch
global time_fun_A1 = @async while true
sleep(1)
timer_1[] += 1
end
return
else
@async Base.throwto(time_fun_A1, InterruptException())
end
return
end
function reset_timer_1(res)
if !res
global time_fun_A2 = @async while true
sleep(1)
end
return
else
timer_1[] = 0
@async Base.throwto(time_fun_A2, InterruptException())
end
return
end
function modify_speed_1(sp)
global speed_1 = sp
return
end
function switch_timer_2(switch)
if switch
global time_fun_B1 = @async while true
sleep(1)
timer_2[] += 1
end
return
else
@async Base.throwto(time_fun_B1, InterruptException())
end
return
end
function reset_timer_2(res)
if !res
global time_fun_B2 = @async while true
sleep(1)
end
return
else
timer_2[] = 0
@async Base.throwto(time_fun_B2, InterruptException())
end
return
end
function modify_speed_2(sp)
global speed_2 = sp
return
end
function modify_I0_1(change)
global initial_I0_1 = parse(Int64, change)
return
end
function modify_R0_1(change)
global initial_R0_1 = parse(Int64,change)
return
end
function modify_I0_2(change)
global initial_I0_2 = parse(Int64, change)
return
end
function modify_R0_2(change)
global initial_R0_2 = parse(Int64,change)
return
end
Ns_1 = slider(1:1000; label = "N")
Betas_1 = slider(0:0.01:1.0; label = "Beta")
Gammas_1 = slider(0:0.01:1.0; label = "Gamma")
Duration_1 = slider(0:10:1000; label = "Duration [Days]")
H_1 = slider(0:0.1:2; label = "RK4 step")
ui2 = @manipulate for N in Ns_1, Beta in Betas_1, Gamma in Gammas_1, Days in Duration_1, h in H_1, t=timer_1
up_days = t*10*speed_1 % Days
parameters = (Beta, Gamma, N, up_days, h)
I0 = initial_I0_1
R0 = initial_R0_1
S0 = N - I0 - R0
init_conds = (S0, I0, R0)
output = Runge_Kutta(init_conds, parameters, funcs);
plt = plot([output[1] output[2] output[3]], vars=[(0,1), (0,2), (0,3)], title=string("SIR Model:\n", "beta = ", round(Beta, digits=2), ", ", "gamma = ", round(Gamma, digits=2)),
xaxis="Time [days]", yaxis="Population", marker=0.01, label=["Susceptible (S)" "Infected (I)" "Removed (R)"],
xticks = 0:(Days/10):Days, yticks = 0:(N/10):N)
wdg = Widget(["N" => N, "Beta" => Beta, "Gamma" => Gamma])
@layout! wdg pad(1em, pad(1em, hbox(plt, vbox(:N, :Beta, :Gamma, :t))))
end
ui2
Ns_2 = slider(1:1000; label = "N")
Betas_2 = slider(0:0.01:1.0; label = "Beta")
Gammas_2 = slider(0:0.01:1.0; label = "Gamma")
Duration_2 = slider(0:10:1000; label = "Duration [Days]")
H_2 = slider(0:0.1:2; label = "RK4 step")
ui3 = @manipulate for N in Ns_2, Beta in Betas_2, Gamma in Gammas_2, Days in Duration_2, h in H_2, t=timer_2#, I0=initial_I0_1, R0=initial_R0_1
up_days = t*10*speed_2 % Days
parameters = (Beta, Gamma, N, up_days, h)
I0 = initial_I0_2
R0 = initial_R0_2
S0 = N - I0 - R0
init_conds = (S0, I0, R0)
output = Runge_Kutta(init_conds, parameters, funcs);
plt = plot([output[1] output[2] output[3]], vars=[(0,1), (0,2), (0,3)], title=string("SIR Model:\n", "beta = ", round(Beta, digits=2), ", ", "gamma = ", round(Gamma, digits=2)),
xaxis="Time [days]", yaxis="Population", marker=0.01, label=["Susceptible (S)" "Infected (I)" "Removed (R)"],
xticks = 0:(Days/10):Days, yticks = 0:(N/10):N)
wdg = Widget(["N" => N, "Beta" => Beta, "Gamma" => Gamma])
@layout! wdg pad(1em, hbox(plt, pad(1em, vbox(:N, :Beta, :Gamma, :t)))) ## custom layout: by default things are stacked vertically
end
ui3
on(switch_timer_1, run_toggle_1)
on(reset_timer_1, reset_toggle_1)
on(modify_speed_1, speed_toggle_1)
on(switch_timer_2, run_toggle_2)
on(reset_timer_2, reset_toggle_2)
on(modify_speed_2, speed_toggle_2)
on(modify_I0_1, I0_box_1)
on(modify_R0_1, R0_box_1)
on(modify_I0_2, I0_box_2)
on(modify_R0_2, R0_box_2)
tot = vbox(
Interact.hline(color="darkblue"),
pad(1em, hbox(
hbox(
pad(1em, run_toggle_1), pad(1em, reset_toggle_1),
pad(1em, I0_box_1), pad(1em, R0_box_1)
),
hbox(
pad(1em, run_toggle_2), pad(1em, reset_toggle_2),
pad(1em, I0_box_2), pad(1em, R0_box_2)
)
)),
pad(1em, hbox(pad(1em, speed_toggle_1), pad(1em, speed_toggle_2))),
pad(1em, hbox(pad(1em, ui2), pad(1em, ui3))),
Interact.hline(color="darkblue")
)
window = Window()
body!(window, tot)
Page(183, WebSocket(server, CONNECTED), Dict{String, Any}("webio" => Blink.AtomShell.var"#22#23"{Blink.AtomShell.WebIOBlinkComm}(Blink.AtomShell.WebIOBlinkComm(Window(188, Electron(Process(`'C:\Users\basia\.julia\packages\Blink\mwJC9\deps\atom\electron.exe' 'C:\Users\basia\.julia\packages\Blink\mwJC9\src\AtomShell\main.js' port 5353`, ProcessRunning), Sockets.TCPSocket(Base.Libc.WindowsRawSocket(0x00000000000005cc) active, 0 bytes waiting), Dict{String, Any}("callback" => Blink.var"#1#2"())), Page(#= circular reference @-5 =#), Task (done) @0x000000007c9515f0))), "callback" => Blink.var"#1#2"()), Distributed.Future(1, 1, 188, Some(true)))
Error handling websocket connection: TaskFailedException Stacktrace: [1] wait @ .\task.jl:317 [inlined] [2] create_socket(req::Dict{Any, Any}) @ WebIO ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:47 [3] (::Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)})(f::Function, x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:17 [4] (::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}})(x::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [5] splitquery(app::Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\basics.jl:31 [6] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [7] wcatch(app::Mux.var"#1#2"{typeof(Mux.splitquery), Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}}, req::Dict{Any, Any}) @ Mux ~\.julia\packages\Mux\3h8RY\src\websockets_integration.jl:12 [8] #1 @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [inlined] [9] todict @ ~\.julia\packages\Mux\3h8RY\src\basics.jl:25 [inlined] [10] #3 (repeats 2 times) @ ~\.julia\packages\Mux\3h8RY\src\Mux.jl:14 [inlined] [11] (::Mux.var"#1#2"{Mux.var"#3#4"{Mux.var"#3#4"{typeof(Mux.todict), typeof(Mux.wcatch)}, typeof(Mux.splitquery)}, Mux.var"#1#2"{Mux.var"#5#6"{Mux.var"#31#32"{Vector{SubString{String}}}, typeof(WebIO.create_socket)}, Mux.var"#1#2"{typeof(Mux.wclose), Mux.var"#1#2"{Mux.var"#21#22"{Mux.var"#25#26"{Symbol, Int64}}, Mux.var"#23#24"{String}}}}})(x::Tuple{HTTP.Messages.Request, WebSockets.WebSocket{Sockets.TCPSocket}}) @ Mux ~\.julia\packages\Mux\3h8RY\src\Mux.jl:10 [12] (::Mux.var"#9#10"{Mux.App})(req::HTTP.Messages.Request, client::WebSockets.WebSocket{Sockets.TCPSocket}) @ Mux ~\.julia\packages\Mux\3h8RY\src\server.jl:49 [13] upgrade(f::Mux.var"#9#10"{Mux.App}, stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:201 [14] (::WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\HTTP.jl:370 [15] macro expansion @ ~\.julia\packages\HTTP\IAI92\src\Servers.jl:367 [inlined] [16] (::HTTP.Servers.var"#13#14"{WebSockets.var"#_servercoroutine#11"{WebSockets.ServerWS}, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}, HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}}})() @ HTTP.Servers .\task.jl:406 nested task error: WebSockets.WebSocketClosedError("ws|server respond to OPCODE_CLOSE 1001: Going Away") Stacktrace: [1] handle_control_frame(ws::WebSockets.WebSocket{Sockets.TCPSocket}, wsf::WebSockets.WebSocketFragment) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:376 [2] read(ws::WebSockets.WebSocket{Sockets.TCPSocket}) @ WebSockets ~\.julia\packages\WebSockets\QcswW\src\WebSockets.jl:459 [3] macro expansion @ ~\.julia\packages\WebIO\Fy9h1\src\providers\mux.jl:41 [inlined] [4] (::WebIO.var"#110#111"{WebIO.WebSockConnection, WebSockets.WebSocket{Sockets.TCPSocket}})() @ WebIO .\task.jl:406
function Runge_Kutta(init_conditions, parameters, functions)
# Initial conditions
S0 = init_conditions[1]
I0 = init_conditions[2]
R0 = init_conditions[3]
# Parameters (beta, gamma, N, days, h)
beta = parameters[1]
gamma = parameters[2]
N = parameters[3]
days = parameters[4]
h = parameters[5]
# Unpack the ODE functions
dS = functions[1]
dI = functions[2]
dR = functions[3]
# Initialise empty result arrs
S_res = Any[]
I_res = Any[]
R_res = Any[]
# Fill result arrs with initial conditions
push!(S_res, S0)
push!(I_res, I0)
push!(R_res, R0)
# Perform iterations
for i in 1:days
k1 = dS(S_res[i], I_res[i], R_res[i], N, beta, gamma)
l1 = dI(S_res[i], I_res[i], R_res[i], N, beta, gamma)
m1 = dR(S_res[i], I_res[i], R_res[i], N, beta, gamma)
k2 = dS(S_res[i] + k1*h/2, I_res[i] + l1*h/2, R_res[i] + m1*h/2, N, beta, gamma)
l2 = dI(S_res[i] + k1*h/2, I_res[i] + l1*h/2, R_res[i] + m1*h/2, N, beta, gamma)
m2 = dR(S_res[i] + k1*h/2, I_res[i] + l1*h/2, R_res[i] + m1*h/2, N, beta, gamma)
k3 = dS(S_res[i] + k2*h/2, I_res[i] + l2*h/2, R_res[i] + m2*h/2, N, beta, gamma)
l3 = dI(S_res[i] + k2*h/2, I_res[i] + l2*h/2, R_res[i] + m2*h/2, N, beta, gamma)
m3 = dR(S_res[i] + k2*h/2, I_res[i] + l2*h/2, R_res[i] + m2*h/2, N, beta, gamma)
k4 = dS(S_res[i] + k3*h, I_res[i] + l3*h, R_res[i] + m3*h, N, beta, gamma)
l4 = dI(S_res[i] + k3*h, I_res[i] + l3*h, R_res[i] + m3*h, N, beta, gamma)
m4 = dR(S_res[i] + k3*h, I_res[i] + l3*h, R_res[i] + m3*h, N, beta, gamma)
S_next = S_res[i] + (h/6)*(k1 + 2*k2 + 2*k3 + k4)
I_next = I_res[i] + (h/6)*(l1 + 2*l2 + 2*l3 + l4)
R_next = R_res[i] + (h/6)*(m1 + 2*m2 + 2*m3 + m4)
push!(S_res, S_next)
push!(I_res, I_next)
push!(R_res, R_next)
end
return S_res, I_res, R_res
end
Runge_Kutta (generic function with 1 method)
# Define model parameters
N = 1000.0
beta = 0.15
gamma = 1.0/14.0
# Initial conditions (populations)
I0 = 1;
R0 = 0;
S0 = N - I0 - R0;
initial_conditions = (S0, I0, R0)
# Define additional parameters
days = 200
h = 1
parameters = (beta, gamma, N, days, h)
# Define the ODE functions
dS(S, I, R, N, beta, gamma) = -beta * S * I / N
dI(S, I, R, N, beta, gamma) = beta * S * I / N - gamma * I
dR(S, I, R, N, beta, gamma) = gamma * I
funcs = (dS, dI, dR)
#Runge-Kutta
output = Runge_Kutta(initial_conditions, parameters, funcs)
(Any[999.0, 998.8441304369333, 998.6755766631111, 998.4933135009048, 998.2962341069097, 998.0831436688928, 997.8527526508146, 997.6036695595166, 997.334393206227, 997.0433044358205 … 180.34647571763455, 180.22810431106194, 180.11494567962217, 180.00676908500378, 179.90335410097836, 179.80449014441473, 179.70997602827376, 179.61961953550357, 179.53323701281147, 179.45065298334268], Any[1, 1.081565866807174, 1.1697562761490417, 1.2651044229837707, 1.3681855976208945, 1.4796203695148034, 1.6000779878909697, 1.7302800097444866, 1.8710041654523482, 2.023088471738235 … 4.474993142981863, 4.280711680820616, 4.094793838883087, 3.9168856822428113, 3.7466477256132227, 3.5837543897281514, 3.4278934739904905, 3.27876564530966, 3.1360839429993757, 2.999573299564527], Any[0, 0.07430369625960788, 0.15466706073990164, 0.2415820761114341, 0.3355802954695052, 0.43723596159245814, 0.547169361294542, 0.666050430739052, 0.7946026283207424, 0.933607092441423 … 815.1785311393836, 815.4911840081174, 815.7902604814948, 816.0763452327534, 816.3499981734084, 816.6117554658571, 816.8621304977357, 817.1016148191868, 817.3306790441892, 817.5497737170929])
plt4 = plot([output[1] output[2] output[3]])
Interaktywne demonstracje
Należy wybrać jeden temat z pliku Mownit__ODE.pdf
Rozwiązaniem jest program pokazujący w interaktywny sposób rozwiązanie danego problemu obliczeniowego. Program powinien mieć graficzny interfejs użytkownika oraz umozliwiać dynamiczną interakcję poprzez zmianę parametrów. Język programowania oraz środowisko: dowolne. Proponowane rozwiązania:
Zadanie 2-tygodniowe